use std::sync::{
    atomic::{AtomicBool, AtomicU32},
    mpsc::Sender,
    Arc, Mutex,
};

use realman::Transport;
use serde::{Deserialize, Serialize};
use serde_repr::Deserialize_repr;

#[derive(Debug)]
pub struct AppState {
    pub car_listen: Sender<(f64, f64)>,    // 小车监听
    pub arm_listen: Arc<Mutex<Transport>>, // 机械臂监听
    pub arm_joint: Arc<Mutex<Vec<i32>>>,   // 机械臂各关节角度
    pub is_record: AtomicBool,             // 是否记录动作, 默认记录
    pub speed: AtomicU32,                  // 速度
}

#[derive(Debug, Serialize)]
pub struct ApiOk;

impl ApiOk {
    pub const OK: ApiOk = ApiOk {};
}

// 小车操作指令
#[derive(Debug, Deserialize_repr, Default)]
#[repr(u8)]
pub enum CarCmd {
    #[default]
    Stop = 0, // 停止
    Froward = 1, // 前
    Back = 2,    // 后
    Left = 3,    // 左
    Right = 4,   // 右
}

// 机械臂操作指令
#[derive(Debug, Deserialize_repr, Default)]
#[repr(u8)]
pub enum ArmCmd {
    #[default]
    Stop = 0, // 停止
    Froward = 1,   // 前
    Back = 2,      // 后
    Left = 3,      // 左
    Right = 4,     // 右
    Up = 5,        // 上
    Down = 6,      // 下
    TurnLeft = 7,  // 左转
    TureRight = 8, // 右转
    Open = 9,      // 夹抓开
    Close = 10,    // 夹抓关
    ZLeft = 11,    // 夹抓左旋转
    ZRight = 12,   // 夹转右旋转
    Init = 98,     // 抓取的初始位置
    Home = 99,     // 默认位置
}

// sensor指令
#[derive(Debug, Deserialize_repr, Default)]
#[repr(u8)]
pub enum SensorType {
    #[default]
    Car = 0, // 小车
    Arm = 1,   // 机械臂
    Clamp = 2, // 夹抓
}

// 夹抓指令
#[derive(Debug, Deserialize_repr, Default)]
#[repr(u8)]
pub enum ClampCmd {
    #[default]
    Close = 1, // 关
    Open = 2, // 开
}

// 记录命令
#[derive(Debug, Deserialize_repr, Default)]
#[repr(u8)]
pub enum RecordCmd {
    #[default]
    Stop = 0,
    Start = 1,
}

impl From<RecordCmd> for bool {
    fn from(value: RecordCmd) -> Self {
        match value {
            RecordCmd::Stop => false,
            RecordCmd::Start => true,
        }
    }
}

#[derive(Debug, Deserialize)]
pub struct SenceVoiceResponse {
    pub result: Vec<SenceVoiceResult>,
}

#[derive(Debug, Deserialize)]
pub struct SenceVoiceResult {
    // pub key: String,
    // pub text: String,
    // pub raw_text: String,
    pub clean_text: String,
}

#[derive(Debug, Serialize)]
pub struct TextResponse {
    pub text: String,
}
